/*
 * @Author: mat
 * @Date: 2020-05-15 14:12:07
 * @LastEditTime: 2020-05-19 19:48:36
 * @Description: 全局公用的方法封装
 */

/* eslint-disable*/

/**
 * @description: 防抖： 在触发完事件的n秒内不再触发事件才执行
 * @param {*} func 回调方法
 * @param {*} wait 时间间隔
 * @param {*} immediate 是否立刻触发
 * @param {*} context this指向
 */
function debounce(func, wait, immediate, context) {
	var timeout
	const debounced = function() {
		const args = arguments
		if (timeout) clearTimeout(timeout)
		if (immediate) {
			// 如果已经执行过，不再执行
			const callNow = !timeout
			timeout = setTimeout(function() {
				timeout = null
			}, wait)
			if (callNow) func.apply(context, args)
		} else {
			timeout = setTimeout(function() {
				func.apply(context, args)
			}, wait)
		}
	}
	debounced.cancel = function() {
		clearTimeout(timeout)
		timeout = null
	}
	return debounced
}

/**
 * @description: 节流： 如果你持续触发事件，每隔一段时间，只执行一次事件
 * @param {*} func 回调方法
 * @param {*} wait 时间间隔
 * @param {*} context this指向
 * @param {*} options leading：false 表示禁用第一次执行 , railing: false 表示禁用停止触发的回调
 */
function throttle(func, wait, context, options) {
	var timeout, args, result
	var previous = 0
	if (!options) options = {}

	var later = function() {
		previous = options.leading === false ? 0 : new Date().getTime()
		timeout = null
		func.apply(context, args)
		if (!timeout) args = null
	}

	var throttled = function() {
		var now = new Date().getTime()
		if (!previous && options.leading === false) previous = now
		var remaining = wait - (now - previous)
		args = arguments
		if (remaining <= 0 || remaining > wait) {
			if (timeout) {
				clearTimeout(timeout)
				timeout = null
			}
			previous = now
			func.apply(context, args)
			if (!timeout) args = null
		} else if (!timeout && options.trailing !== false) {
			timeout = setTimeout(later, remaining)
		}
	}
	return throttled
}
/**
 * @description: 简化版节流：使用时间戳实现，如果你持续触发事件，每隔一段时间，只执行一次事件
 * @param {*} func 回调方法
 * @param {*} wait 时间间隔
 * @param {*} context this指向
 * @param {*} options leading：false 表示禁用第一次执行 , railing: false 表示禁用停止触发的回调
 */
function simpleThrottle(func, wait, context) {
	var timeout, args
	return function() {
		args = arguments
		if (!timeout) {
			timeout = setTimeout(function() {
				timeout = null
				func.apply(context, args)
			}, wait)
		}
	}
}
function getArrayIndex(arrays, obj) {
	var i = arrays.length
	while (i--) {
		if (arrays[i] === obj) {
			return i
		}
	}
	return false
}

export { debounce, throttle, simpleThrottle, getArrayIndex }
